package com.ruoyi.game.service.impl;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.game.constants.Constants;
import com.ruoyi.game.exception.RechargeCardException;
import com.ruoyi.game.service.IGameUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.game.mapper.RechargeCardMapper;
import com.ruoyi.game.domain.RechargeCard;
import com.ruoyi.game.service.IRechargeCardService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 充值卡Service业务层处理
 *
 * @author 小胖
 * @date 2022-05-12
 */
@Service
public class RechargeCardServiceImpl implements IRechargeCardService
{
    @Autowired
    private RechargeCardMapper rechargeCardMapper;

    @Autowired
    private IGameUserService gameUserService;

    /**
     * 查询充值卡
     *
     * @param rechargeCardId 充值卡主键
     * @return 充值卡
     */
    @Override
    public RechargeCard selectRechargeCardByRechargeCardId(Long rechargeCardId)
    {
        return rechargeCardMapper.selectRechargeCardByRechargeCardId(rechargeCardId);
    }

    /**
     * 查询充值卡
     *
     * @param cardNumber 卡号
     * @return 充值卡
     */
    @Override
    public RechargeCard selectRechargeCardByCardNumber(String cardNumber)
    {
        return rechargeCardMapper.selectRechargeCardByCardNumber(cardNumber);
    }

    /**
     * 查询充值卡
     *
     * @param cardPass 卡密
     * @return 充值卡
     */
    @Override
    public RechargeCard selectRechargeCardByCardPass(String cardPass)
    {
        return rechargeCardMapper.selectRechargeCardByCardPass(cardPass);
    }

    /**
     * 查询充值卡列表
     *
     * @param rechargeCard 充值卡
     * @return 充值卡
     */
    @Override
    public List<RechargeCard> selectRechargeCardList(RechargeCard rechargeCard)
    {
        return rechargeCardMapper.selectRechargeCardList(rechargeCard);
    }

    /**
     * 新增充值卡
     *
     * @param rechargeCard 充值卡
     * @return 结果
     */
    @Override
    public int insertRechargeCard(RechargeCard rechargeCard)
    {
        rechargeCard.setCreateTime(DateUtils.getNowDate());
        rechargeCard.setCreateBy(SecurityUtils.getUsername());
        Snowflake snowflake = IdUtil.getSnowflake();
        this.batchInsertRechargeCard(
                IntStream.rangeClosed(1, rechargeCard.getQuantity())
                        .boxed()
                        .map(i -> BeanUtil.copyProperties(rechargeCard, RechargeCard.class).setCardNumber(snowflake.nextIdStr()).setCardPass(IdUtil.fastSimpleUUID()))
                        .collect(Collectors.toList())
        );
        return 1;
    }


    /**
     * 批量添加充值卡
     *
     * @param rechargeCardList 充值卡
     */
    @Override
    public void batchInsertRechargeCard(List<RechargeCard> rechargeCardList)
    {
        ListUtil.split(rechargeCardList, 1000).forEach(rechargeCardMapper::batchInsertRechargeCard);
    }

    /**
     * 修改充值卡
     *
     * @param rechargeCard 充值卡
     * @return 结果
     */
    @Override
    public int updateRechargeCard(RechargeCard rechargeCard)
    {
        rechargeCard.setUpdateTime(DateUtils.getNowDate());
        rechargeCard.setUpdateBy(SecurityUtils.getUsername());
        return rechargeCardMapper.updateRechargeCard(rechargeCard);
    }

    /**
     * 批量删除充值卡
     *
     * @param rechargeCardIds 需要删除的充值卡主键
     * @return 结果
     */
    @Override
    public int deleteRechargeCardByRechargeCardIds(Long[] rechargeCardIds)
    {
        return rechargeCardMapper.deleteRechargeCardByRechargeCardIds(rechargeCardIds);
    }

    /**
     * 删除充值卡信息
     *
     * @param rechargeCardId 充值卡主键
     * @return 结果
     */
    @Override
    public int deleteRechargeCardByRechargeCardId(Long rechargeCardId)
    {
        return rechargeCardMapper.deleteRechargeCardByRechargeCardId(rechargeCardId);
    }

    /**
     * 充值
     *
     * @param rechargeCard 充值卡
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int recharge(RechargeCard rechargeCard)
    {
        // 根据卡号查询
//        RechargeCard selRechargeCard = Assert.notNull(this.selectRechargeCardByCardNumber(rechargeCard.getCardNumber()), () -> new RechargeCardException("卡号或卡密错误"));
        // 根据卡密查询
        RechargeCard selRechargeCard = Assert.notNull(this.selectRechargeCardByCardPass(rechargeCard.getCardPass()), () -> new RechargeCardException("卡密错误"));
        // 判断卡密是否一样
//        Assert.isTrue(StrUtil.equals(selRechargeCard.getCardPass(), rechargeCard.getCardPass()), () -> new RechargeCardException("卡号或卡密错误"));
        // 判断是否未使用
        Assert.isTrue(StrUtil.equals(Constants.RechargeCard.USE_STATUS_NOT_USED, selRechargeCard.getUseStatus()), () -> new RechargeCardException("当前充值卡已使用, 不可重复使用"));
        // 充值金币
        gameUserService.recharge(selRechargeCard.getGoldCoin());
        // 修改充值卡状态 用户id
        selRechargeCard.setUseStatus(Constants.RechargeCard.USE_STATUS_USED).setUserId(SecurityUtils.getUserId());
        return this.updateRechargeCard(selRechargeCard);
    }
}
